package br.com.conciliador.integracao.apresentacao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import br.com.conciliador.cadastro.negocio.BandeiraNgc;
import br.com.conciliador.cadastro.negocio.EstLojaNgc;
import br.com.conciliador.cadastro.negocio.ProdutoNgc;
import br.com.conciliador.cadastro.vo.BandeiraVo;
import br.com.conciliador.cadastro.vo.EstLojaVo;
import br.com.conciliador.cadastro.vo.ProdutoVo;
import br.com.conciliador.integracao.negocio.DigitacaoCupomNgc;
import br.com.conciliador.integracao.vo.DigitacaoCupomVo;
import br.com.conciliador.integracao.vo.filtro.FiltroDigitacaoCupomVo;
import br.com.conciliador.seguranca.vo.ExtensaoUsuarioVo;
import br.com.conciliador.seguranca.vo.UsuarioVo;
import br.com.conciliador.util.jsf.AbstractBean;
import br.com.conciliador.util.jsf.JSFUtil;
import br.com.r2.exception.R2Exception;
import br.com.r2.util.tipodado.Data;
import br.com.r2.util.tipodado.Flag;
import br.com.r2.util.tipodado.InteiroLongo;
import br.com.r2.util.tipodado.Texto;
import br.com.r2.util.tipodado.YesNo;

public class DigitacaoCupomBean extends AbstractBean<DigitacaoCupomVo, DigitacaoCupomNgc>
{

   private List<EstLojaVo> listaEstLojas;

   private List<BandeiraVo> listaBandeiras;

   private List<ProdutoVo> listaProdutos;

   private boolean exibirListaLojas;
   
   JSFUtil util = new JSFUtil();
   
   public DigitacaoCupomBean()
   {
      super(DigitacaoCupomNgc.getInstancia());
      this.ACTION_SEARCH = "digitacaoCupom";
      this.pageTitle = "titulo_digitacao_cupom";
   }

   @Override
   protected void setListaPesquisa() throws R2Exception
   {
      setarListaEstLojas();
      setarListaBandeiras();
   }

   @Override
   public String preparaPesquisar()
   {

      String retorno = super.preparaPesquisar();
      if (this.getSearchObject().getFiltro() == null)
      {
         this.getSearchObject().setFiltro(new FiltroDigitacaoCupomVo());
      }

      Data filtroData = new Data(new Date());
      this.getSearchObject().getFiltro().setDataVendaFinal(filtroData);
      filtroData = new Data(new Date());
      filtroData.add(GregorianCalendar.DAY_OF_MONTH, -1);
      this.getSearchObject().getFiltro().setDataVendaInicial(filtroData);

      try
      {
         this.getSearchObject().getFiltro().setUsuarioVo(util.getUsuarioLogado());
      }
      catch (R2Exception e)
      {
         e.printStackTrace();
      }
      
      return retorno;
   }

   @Override
   protected void validarPesquisar() throws R2Exception
   {
      if (this.getSearchObject().getFiltro() == null)
      {
         throw new R2Exception("campo_periodo_obrigatorio");
      }

      if (this.getSearchObject().getFiltro().getDataVendaInicial() == null || !this.getSearchObject().getFiltro().getDataVendaInicial().isPreenchido())
      {
         throw new R2Exception("campo_periodo_obrigatorio");
      }
   }
   
   private void setarListaEstLojas() throws R2Exception
   {
	   
	   UsuarioVo usuarioVo = util.getUsuarioVo();
	   this.setExibirListaLojas(true);

	   if (usuarioVo == null)
	   {
		   throw new R2Exception("usuario.logado.nao.sessao");
	   }

	   if (usuarioVo.getEstEmpresaVo() == null || usuarioVo.getEstEmpresaVo().getCodigo() == null || !usuarioVo.getEstEmpresaVo().getCodigo().isPreenchido())
	   {
		   throw new R2Exception("usuario.logado.sem.empresa");
	   }

	   this.listaEstLojas = new ArrayList<EstLojaVo>();
	      
	   if (usuarioVo.getListaExtensaoUsuarioVo() == null || usuarioVo.getListaExtensaoUsuarioVo().size() == 0)
	   {
	      EstLojaVo estLojaVo = new EstLojaVo();
	      estLojaVo.setEstEmpresaVo(usuarioVo.getEstEmpresaVo());
	      estLojaVo.setSituacao(new Flag(YesNo.YES));
	         
	      List<EstLojaVo> lista = EstLojaNgc.getInstancia().pesquisar(estLojaVo, EstLojaNgc.JOIN_EST_EMPRESA);

	      EstLojaVo vazio = new EstLojaVo();
	      vazio.setDescricao(new Texto("TODAS"));

	      this.listaEstLojas.add(vazio);
	      this.listaEstLojas.addAll(lista);
	   }
	   else if (usuarioVo.getListaExtensaoUsuarioVo().size() > 1)
	   {
	      EstLojaVo vazio = new EstLojaVo();
          vazio.setDescricao(new Texto("TODAS"));
          this.listaEstLojas.add(vazio);
          
          List<EstLojaVo> lista = new ArrayList<EstLojaVo>();
          Iterator<ExtensaoUsuarioVo> iterator = usuarioVo.getListaExtensaoUsuarioVo().iterator();
          while (iterator.hasNext())
          {
             ExtensaoUsuarioVo element = (ExtensaoUsuarioVo) iterator.next();
             lista.add(element.getEstLojaVo());
          }
          
          Collections.sort(lista, new Comparator()
          {
             public int compare(Object o1, Object o2)
             {
                String c1 = ((EstLojaVo) o1).getDescricao().getValor();
                String c2 = ((EstLojaVo) o2).getDescricao().getValor();
                return c1.compareTo(c2);
             }
          }
          );
          
          this.listaEstLojas.addAll(lista);	         
       }
	   else
	   {
		   List<ExtensaoUsuarioVo> lista = new ArrayList<ExtensaoUsuarioVo>(usuarioVo.getListaExtensaoUsuarioVo());
		   ExtensaoUsuarioVo extensaoUsuarioVo = (ExtensaoUsuarioVo) lista.get(0);
		   if (this.getSearchObject().getFiltro() == null)
		   {
			   this.getSearchObject().setFiltro(new FiltroDigitacaoCupomVo());
		   }
		   this.getSearchObject().getFiltro().setEstLoja(extensaoUsuarioVo.getEstLojaVo().getCodigo());
		   this.getSearchObject().getFiltro().setNomeEstLoja(extensaoUsuarioVo.getEstLojaVo().getDescricao());
		   this.setExibirListaLojas(false);
	   }
    }

   private void setarListaBandeiras() throws R2Exception
   {
      this.listaBandeiras = new ArrayList<BandeiraVo>();
      BandeiraVo bandeiraVo = new BandeiraVo();
      bandeiraVo.setFlagAtivo(new Flag(YesNo.YES));
      List<BandeiraVo> lista = BandeiraNgc.getInstancia().pesquisar(bandeiraVo, 0);

      BandeiraVo vazio = new BandeiraVo();
      vazio.setDescricao(new Texto("TODAS"));

      this.listaBandeiras.add(vazio);
      this.listaBandeiras.addAll(lista);
   }

   public void setarListaProdutos(ActionEvent event) throws R2Exception
   {
      if (this.getSearchObject().getBandeira() != null && this.getSearchObject().getBandeira().isPreenchido())
      {
         ProdutoVo produtoVo = new ProdutoVo();
         BandeiraVo bandeiraVo = new BandeiraVo();
         bandeiraVo.setCodigo(this.getSearchObject().getBandeira());
         produtoVo.setBandeiraVo(bandeiraVo);
         produtoVo.setFlagAtivo(new Flag(YesNo.YES));
         int join = ProdutoNgc.JOIN_BANDEIRA;
         List<ProdutoVo> lista = ProdutoNgc.getInstancia().pesquisar(produtoVo, join);

         produtoVo = new ProdutoVo();
         produtoVo.setDescricao(new Texto("TODOS"));
         this.setListaProdutos(new ArrayList<ProdutoVo>());
         this.getListaProdutos().add(produtoVo);
         if (lista != null)
         {
            this.getListaProdutos().addAll(lista);
         }
      }
   }

   public void pesquisar(ActionEvent event)
   {
      try
      {
         validarPesquisar();
         completarPesquisar();
         List <DigitacaoCupomVo> lista = DigitacaoCupomNgc.getInstancia().pesquisar(this.getSearchObject(), this.getJoinPesquisar());
         if (lista != null && lista.size() > 0)
         {
            int cont = 1;
            Iterator<DigitacaoCupomVo> iterator = lista.iterator();
            while (iterator.hasNext())
            {
               DigitacaoCupomVo element = (DigitacaoCupomVo) iterator.next();
               element.setSequencial(new InteiroLongo(cont++));
            }
         }
         this.setSearchResult(lista); 
         setCurrentState(STATE_SEARCH);
      }
      catch (R2Exception e)
      {
         FacesMessage message = new FacesMessage(e.getMensagem());  
         message.setSeverity(FacesMessage.SEVERITY_ERROR);  
         FacesContext.getCurrentInstance().addMessage("", message);  
      }
   }

   public void cadastrar(ActionEvent event)
   {
      try
      {
         if (this.getSearchResult() != null && this.getSearchResult().size() > 0)
         {
            JSFUtil jsfUtil = new JSFUtil();
            UsuarioVo usuarioVo = jsfUtil.getUsuarioLogado();
            DigitacaoCupomNgc.getInstancia().cadastrar(this.getSearchResult(), usuarioVo);
         }
         super.pesquisar(event);
      }
      catch (R2Exception e)
      {
         FacesMessage message = new FacesMessage(e.getMensagem());  
         message.setSeverity(FacesMessage.SEVERITY_ERROR);  
         FacesContext.getCurrentInstance().addMessage("", message);
      }
   }
   
   public List<EstLojaVo> getListaEstLojas()
   {
      return listaEstLojas;
   }

   public void setListaEstLojas(List<EstLojaVo> listaEstLojas)
   {
      this.listaEstLojas = listaEstLojas;
   }

   public List<BandeiraVo> getListaBandeiras()
   {
      return listaBandeiras;
   }

   public void setListaBandeiras(List<BandeiraVo> listaBandeiras)
   {
      this.listaBandeiras = listaBandeiras;
   }

   public List<ProdutoVo> getListaProdutos()
   {
      return listaProdutos;
   }

   public void setListaProdutos(List<ProdutoVo> listaProdutos)
   {
      this.listaProdutos = listaProdutos;
   }

   public boolean isExibirListaLojas() {
	   return exibirListaLojas;
   }

   public void setExibirListaLojas(boolean exibirListaLojas) {
	   this.exibirListaLojas = exibirListaLojas;
   }
}
